package it.gestoreContratti.gui.panels;

import it.gestoreContratti.database.DatabaseController;
import it.gestoreContratti.database.exception.DatabaseConnectionException;
import it.gestoreContratti.database.exception.QueryException;
import it.gestoreContratti.entity.Contratto;
import it.gestoreContratti.entity.Specifica;
import it.gestoreContratti.inputVerifiers.DateInputVerifier;
import it.gestoreContratti.inputVerifiers.NumericInputVerifier;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ProrogaSpecificaPanel extends JPanel {	
	
	private static final long serialVersionUID = -5276921787451254119L;
	private JTextField numeroContrattoTextField;
	private JTextField numeroSpecificaTextField;
	private JLabel dataScadenzaContrattoLabel;
	private JTextField dataScadenzaContrattoTextField;
	private JLabel dataInizioSpecificaLabel;
	private JTextField dataInizioSpecificaTextField;
	private JLabel prorogaLabel;
	private JTextField prorogaTextField;
	private JLabel dataScadenzaSpecificaLabel;
	private JTextField dataScadenzaSpecificaTextField;
	private JLabel lblDataInizioContratto;
	private JTextField dataInizioContrattoTextField;
	private JButton prorogaSpecificaButton;
	private DateFormat dateFormat;
	private Contratto contratto;
	private DatabaseController databaseController;	
	private Specifica specifica;
	
	
	public ProrogaSpecificaPanel(Contratto c, DatabaseController dbController, Specifica spec) {
		this.contratto = c;
		this.databaseController = dbController;
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{176, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
		gridBagLayout.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
		setLayout(gridBagLayout);
		
		this.dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		this.specifica = spec;
		JLabel numeroContrattoLabel = new JLabel("Numero Contratto");
		GridBagConstraints gbc_numeroContrattoLabel = new GridBagConstraints();
		gbc_numeroContrattoLabel.insets = new Insets(0, 0, 5, 5);
		gbc_numeroContrattoLabel.anchor = GridBagConstraints.EAST;
		gbc_numeroContrattoLabel.gridx = 0;
		gbc_numeroContrattoLabel.gridy = 0;
		add(numeroContrattoLabel, gbc_numeroContrattoLabel);
		
		numeroContrattoTextField = new JTextField();
		numeroContrattoTextField.setText(contratto.getNumero().toString());
		numeroContrattoTextField.setEditable(false);
		GridBagConstraints gbc_numeroContrattoTextField = new GridBagConstraints();
		gbc_numeroContrattoTextField.insets = new Insets(0, 0, 5, 0);
		gbc_numeroContrattoTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_numeroContrattoTextField.gridx = 1;
		gbc_numeroContrattoTextField.gridy = 0;
		add(numeroContrattoTextField, gbc_numeroContrattoTextField);
		numeroContrattoTextField.setColumns(10);
		
		lblDataInizioContratto = new JLabel("Data Inizio Contratto");
		GridBagConstraints gbc_lblDataInizioContratto = new GridBagConstraints();
		gbc_lblDataInizioContratto.anchor = GridBagConstraints.EAST;
		gbc_lblDataInizioContratto.insets = new Insets(0, 0, 5, 5);
		gbc_lblDataInizioContratto.gridx = 0;
		gbc_lblDataInizioContratto.gridy = 1;
		add(lblDataInizioContratto, gbc_lblDataInizioContratto);
		
		dataInizioContrattoTextField = new JTextField();
		dataInizioContrattoTextField.setText(dateFormat.format(contratto.getDataInizio()));
		dataInizioContrattoTextField.setEditable(false);
		GridBagConstraints gbc_dataInizioContrattoTextField = new GridBagConstraints();
		gbc_dataInizioContrattoTextField.insets = new Insets(0, 0, 5, 0);
		gbc_dataInizioContrattoTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_dataInizioContrattoTextField.gridx = 1;
		gbc_dataInizioContrattoTextField.gridy = 1;
		add(dataInizioContrattoTextField, gbc_dataInizioContrattoTextField);
		dataInizioContrattoTextField.setColumns(10);
		
		dataScadenzaContrattoLabel = new JLabel("Data Scadenza Contratto");		
		GridBagConstraints gbc_dataScadenzaContrattoLabel = new GridBagConstraints();
		gbc_dataScadenzaContrattoLabel.anchor = GridBagConstraints.EAST;
		gbc_dataScadenzaContrattoLabel.insets = new Insets(0, 0, 5, 5);
		gbc_dataScadenzaContrattoLabel.gridx = 0;
		gbc_dataScadenzaContrattoLabel.gridy = 2;
		add(dataScadenzaContrattoLabel, gbc_dataScadenzaContrattoLabel);
		
		dataScadenzaContrattoTextField = new JTextField();
		dataScadenzaContrattoTextField.setText(dateFormat.format(contratto.getDataScadenza()));
		dataScadenzaContrattoTextField.setEditable(false);
		GridBagConstraints gbc_dataScadenzaTextField = new GridBagConstraints();
		gbc_dataScadenzaTextField.insets = new Insets(0, 0, 5, 0);
		gbc_dataScadenzaTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_dataScadenzaTextField.gridx = 1;
		gbc_dataScadenzaTextField.gridy = 2;
		add(dataScadenzaContrattoTextField, gbc_dataScadenzaTextField);
		dataScadenzaContrattoTextField.setColumns(10);
		
		JLabel numeroSpecificaLabel = new JLabel("Numero Specifica");
		GridBagConstraints gbc_numeroSpecificaLabel = new GridBagConstraints();
		gbc_numeroSpecificaLabel.anchor = GridBagConstraints.EAST;
		gbc_numeroSpecificaLabel.insets = new Insets(0, 0, 5, 5);
		gbc_numeroSpecificaLabel.gridx = 0;
		gbc_numeroSpecificaLabel.gridy = 3;
		add(numeroSpecificaLabel, gbc_numeroSpecificaLabel);
		
		numeroSpecificaTextField = new JTextField();
		numeroSpecificaTextField.setEditable(false);
		numeroSpecificaTextField.setInputVerifier(new NumericInputVerifier("Numero Specifica", 15));
		numeroSpecificaTextField.setText(specifica.getNumero().toString());
		GridBagConstraints gbc_numeroSpecificaLabelTextField = new GridBagConstraints();
		gbc_numeroSpecificaLabelTextField.insets = new Insets(0, 0, 5, 0);
		gbc_numeroSpecificaLabelTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_numeroSpecificaLabelTextField.gridx = 1;
		gbc_numeroSpecificaLabelTextField.gridy = 3;
		add(numeroSpecificaTextField, gbc_numeroSpecificaLabelTextField);
		numeroSpecificaTextField.setColumns(10);
		
		dataInizioSpecificaLabel = new JLabel("Data Inizio Specifica");
		GridBagConstraints gbc_dataInizioSpecificaLabel = new GridBagConstraints();
		gbc_dataInizioSpecificaLabel.anchor = GridBagConstraints.EAST;
		gbc_dataInizioSpecificaLabel.insets = new Insets(0, 0, 5, 5);
		gbc_dataInizioSpecificaLabel.gridx = 0;
		gbc_dataInizioSpecificaLabel.gridy = 4;
		add(dataInizioSpecificaLabel, gbc_dataInizioSpecificaLabel);
		
		dataInizioSpecificaTextField = new JTextField();
		dataInizioSpecificaTextField.setEditable(false);
		dataInizioSpecificaTextField.setText(dateFormat.format(specifica.getDataInizio()));		
		GridBagConstraints gbc_dataInizioSpecificaTextField = new GridBagConstraints();
		gbc_dataInizioSpecificaTextField.insets = new Insets(0, 0, 5, 0);
		gbc_dataInizioSpecificaTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_dataInizioSpecificaTextField.gridx = 1;
		gbc_dataInizioSpecificaTextField.gridy = 4;
		add(dataInizioSpecificaTextField, gbc_dataInizioSpecificaTextField);
		dataInizioSpecificaTextField.setColumns(10);
		
		prorogaLabel = new JLabel("Proroga(GG)");
		GridBagConstraints gbc_prorogaLabel = new GridBagConstraints();
		gbc_prorogaLabel.anchor = GridBagConstraints.EAST;
		gbc_prorogaLabel.insets = new Insets(0, 0, 5, 5);
		gbc_prorogaLabel.gridx = 0;
		gbc_prorogaLabel.gridy = 5;
		add(prorogaLabel, gbc_prorogaLabel);
		
		prorogaTextField = new JTextField();
		prorogaTextField.addFocusListener(new FocusAdapter() {
			@Override
			public void focusLost(FocusEvent arg0) {
				if(dataInizioSpecificaTextField.getText().length() !=0 && prorogaTextField.getText().length() != 0){
					try{
						Calendar inizio = new GregorianCalendar();
						inizio.setTime(specifica.getDataInizio());
						BigDecimal proroga = new BigDecimal(prorogaTextField.getText());
						BigDecimal nuovoTermineConsegna  = proroga.add(specifica.getTermineConsegna());
						inizio.add(Calendar.DAY_OF_MONTH, nuovoTermineConsegna.intValue());
						Date nuovaScadenza = inizio.getTime();						
						dataScadenzaSpecificaTextField.setText(dateFormat.format(nuovaScadenza));
					} catch (NumberFormatException e) {						
					}
				}
			}
		});
		prorogaTextField.setInputVerifier(new NumericInputVerifier("Termine Consegna", 4));
		GridBagConstraints gbc_prorogaTextField = new GridBagConstraints();
		gbc_prorogaTextField.insets = new Insets(0, 0, 5, 0);
		gbc_prorogaTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_prorogaTextField.gridx = 1;
		gbc_prorogaTextField.gridy = 5;
		add(prorogaTextField, gbc_prorogaTextField);
		prorogaTextField.setColumns(10);
		
		dataScadenzaSpecificaLabel = new JLabel("Data Scadenza Specifica");
		GridBagConstraints gbc_dataScadenzaSpecificaLabel = new GridBagConstraints();
		gbc_dataScadenzaSpecificaLabel.anchor = GridBagConstraints.EAST;
		gbc_dataScadenzaSpecificaLabel.insets = new Insets(0, 0, 5, 5);
		gbc_dataScadenzaSpecificaLabel.gridx = 0;
		gbc_dataScadenzaSpecificaLabel.gridy = 6;
		add(dataScadenzaSpecificaLabel, gbc_dataScadenzaSpecificaLabel);
		
		dataScadenzaSpecificaTextField = new JTextField();
		dataScadenzaSpecificaTextField.setText(dateFormat.format(specifica.getDataScadenza()));
		dataScadenzaSpecificaTextField.setInputVerifier(new DateInputVerifier("Data Scadenza Specifica"));
		dataScadenzaSpecificaTextField.setEditable(false);
		GridBagConstraints gbc_dataScadenzaSpecificaTextField = new GridBagConstraints();
		gbc_dataScadenzaSpecificaTextField.insets = new Insets(0, 0, 5, 0);
		gbc_dataScadenzaSpecificaTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_dataScadenzaSpecificaTextField.gridx = 1;
		gbc_dataScadenzaSpecificaTextField.gridy = 6;
		add(dataScadenzaSpecificaTextField, gbc_dataScadenzaSpecificaTextField);
		dataScadenzaSpecificaTextField.setColumns(10);
		
		prorogaSpecificaButton = new JButton("Proroga Specifica");
		prorogaSpecificaButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				try{
					int conferma = JOptionPane.showConfirmDialog(null, "Prorogare la specifica?", "", JOptionPane.YES_NO_OPTION);
					if(conferma == JOptionPane.YES_OPTION){
						Calendar inizio = new GregorianCalendar();
						inizio.setTime(specifica.getDataInizio());
						BigDecimal proroga = new BigDecimal(prorogaTextField.getText());
						BigDecimal nuovoTermineConsegna  = proroga.add(specifica.getTermineConsegna());
						inizio.add(Calendar.DAY_OF_MONTH, nuovoTermineConsegna.intValue());
						Date nuovaScadenza = inizio.getTime();
						databaseController.prorogaSpecifica(specifica.getNumero(), nuovoTermineConsegna, nuovaScadenza);
						JOptionPane.showMessageDialog(null, "Specifica prorogata correttamente", "", JOptionPane.INFORMATION_MESSAGE);
						 
					}					
					
				} catch (NumberFormatException e) {						
				}catch (DatabaseConnectionException e) {
					JOptionPane.showMessageDialog(null, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);
				} catch (QueryException e) {
					JOptionPane.showMessageDialog(null, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);
				}
			}
				
			
		});
		GridBagConstraints gbc_prorogaSpecificaButton = new GridBagConstraints();
		gbc_prorogaSpecificaButton.anchor = GridBagConstraints.SOUTHEAST;
		gbc_prorogaSpecificaButton.gridx = 1;
		gbc_prorogaSpecificaButton.gridy = 7;
		add(prorogaSpecificaButton, gbc_prorogaSpecificaButton);

	}

}
